//管子pipe构造函数

(function () {
  var Pipe = (window.Pipe = function () {
    //从全局的game中介者对象中得到管子图片两张.
    this.pipe_up = game.imgS.pipe_down; //上管子
    this.pipe_down = game.imgS.pipe_up;  //下管子
    this.speed = 10;  //管子的移动速度
    //定义每个实例化对象的初始出现的X坐标,管子每次出现在canvas画布的右边也就是移动canvas的宽度
    this.x = myCanvas.width;
    //定义每个实例化对象两个管子加空隙的总高度：管子up 的高度 + 管子down的高度 + 两个管子之间的空隙的高度
    //管子全部占用高度就是 canvas的宽乘以 0.78比例,响应式
    this.allHeigth = myCanvas.height * 0.78;
    //定义管子空隙的高度
    this.interSpaceHeight = 100;
    //定义每个实例化对象上面管子的高度 随机高度
    this.heightUp = getRandom(180, 285);
    //定义每个实例化对象下面管子的高度  :随机高度:总高度减上管子的高度-两个管子的空隙120
    this.heigthDown = this.allHeigth - this.heightUp - this.interSpaceHeight;
    //函数截流：针对于得分的，已经通过了就不再加分
    this.alreadyPass = false;
    //实例化对象将自己push到game对象的pipeArr,让定时器来循环数组的长度，每一次循环更新并渲染管子,这样就能产生多个随机管子
    game.pipeArr.push(this);
  });

  //Pipe管子的渲染
  Pipe.prototype.render = function () {
    //绘制上管子   绘制的X坐标是每次都会改变
    game.ctx.drawImage(
        this.pipe_up,
        0,
        320 - this.heightUp,
        52,
        this.heightUp,
        this.x,
        0,
        52,
        this.heightUp
    );
    //绘制下管子 :原图X0，y0位置开始截取，截图W52,H：this.heigthDown,绘制在canvas上下文的X：canvas宽度，Y：上管子的高+120的空隙。绘制多大？ W52, H:this.heigthDown
    game.ctx.drawImage(
        this.pipe_down,
        0,
        0,
        52,
        this.heigthDown,
        this.x,
        this.heightUp + this.interSpaceHeight,
        52,
        this.heigthDown
    );
    //开发者模式：AABB碰撞盒测试
    // game.ctx.strokeStyle = "red";
    // game.ctx.strokeRect(this.x, this.heightUp, 52, 1); //上碰撞线
    // game.ctx.strokeRect(this.x, this.heightUp + this.interSpaceHeight, 52, 1); //下碰撞线
    // game.ctx.strokeRect(this.x, this.heightUp - 52, 1, 52); //左碰撞线
    // game.ctx.strokeRect(this.x + 52, this.heightUp - 52, 1, 52); //右碰撞线
  };

  //Pipe状态的更新，将碰撞检测和得分判断都写在这里，因为拿每一个管子pipe对象的坐标等等状态都去判断 一个鸟的状态和坐标会非常简单easyly!!!
  Pipe.prototype.update = function () {
    //X方向值 每次减去速度speed值,这样渲染管子的时候使用这个改变后的x坐标在canvas画布上渲染，管子就能产生不断移动的动画
    this.x -= this.speed;
    //计算水管的AABB盒碰撞盒
    this.T = this.heightUp;
    this.B = this.heightUp + this.interSpaceHeight;
    // 上下两根管子共用左右两条边的判断
    this.L = this.x;
    this.R = this.x + 52;
    //碰撞判断
    if (game.bird.R > this.L && game.bird.L < this.R) {
      if (game.bird.T < this.T || game.bird.B > this.B) {
         //如果碰撞了，那么直接进入场景4
        game.SM.enter(4);
      }
    }
    //得分的判断
    //如果bird的L坐标大于了管子的R,并且是“管子未被通过的状态”，那么判定得1分，并且把管子更新为“已被通过”,进行一波函数截流
    if (game.bird.L > this.R && !this.alreadyPass) {
      game.score++;
      this.alreadyPass = true;
    }
    //管子如果出了视口就从game.pipe数组中删除自己防止内存泄漏
    if (this.x < -52) {
      //遍历game类的管子数组
      for (let i = 0; i < game.pipeArr.length; i++) {
        //如果管子数组中的i下标是自己，那么把自己删除 数组的splice方法
        if (game.pipeArr[i] == this) {
          game.pipeArr.splice(i, 1);
        }
      }
    }

    //速度的加快（根据时间难度增加）
    // if (game.fno > 150) {
    //   this.speed = 10;
    // }
    // if (game.fno > 500) {
    //   this.speed = 10;
    // }
    // if (game.fno > 1000) {
    //   this.speed = 10;
    // }
    // if (game.fno > 1500) {
    //   this.speed = 10;
    // }


  };
})();
